#pragma once

#include <stdint.h>
#include <stdbool.h>

#define ST_RECORD_SIZE 200          // 压机状态, 温度等连续记录的buf最大尺寸
#define ST_TIME_ZONE_FLAG 0xff      // 时间队列中时区标志, 每隔240分钟设置一个
#define ST_TIME_ZONE_SIZE 240       // 时间队列中时区大小, 最大记录240分钟，超过就要跨越时区
#define ST_TIME_EMPTY_FLAG 0xfe     // 时间队列中单元没使用标志 

// 自检上报数据结构
typedef struct {
    uint8_t version; // 版本(各个产品需要的信息可能不一致)
    // 基本信息
    uint8_t m0_start_cause; // m0启动原因 - 参见 START_CAUSE_M0
    uint8_t cat1_start_cause; // cat1启动原因 - 参见 START_CAUSE_CAT1
    uint32_t m0_startup_time; // m0启动时间, UTC 1970年以来的秒
    uint32_t cat1_startup_time; // cat1启动时间, UTC 1970年以来的秒
    uint32_t m0_run_time; // m0本次累计运行时间, 秒
    uint32_t cat1_run_time; // cat1本次累计运行时间, 秒
    // 串口信息
    uint8_t uart0_health;   // 串口0通信健康度/24h, (总通讯次数 - 失败次数)/总通讯次数
    uint8_t uart1_health;   // 串口1通信健康度/24h, (总通讯次数 - 失败次数)/总通讯次数
    // 基站信息
    uint8_t base_signal;  // 最新基站信息, 信号强度
    uint8_t base_mcc;  // 最新基站信息, mcc
    uint8_t base_mnc;  // 最新基站信息, mnc
    uint8_t base_lac;  // 最新基站信息, lac
    uint8_t base_cell_id;  // 最新基站信息, cell id
    // WiFi信息
    uint8_t wifi_avg_num;   // 平均扫描到的wifi数量
    
    uint8_t tem_num;    // 24h内记录到的温度转折点数量, 最多记录255个
    uint8_t comp_num;    // 24h内记录到的压机启停数量, 最多记录255个

    uint16_t door_open_num;  // 24h内记录到的开关门次数, 最多记录65535次
    uint16_t human_num;  // 24h内记录到的人流量, 最多记录65535次

    uint16_t avg_pow;   // 24h平均功耗
    uint16_t avg_cur;   // 24h平均电流
    uint16_t max_cur;   // 24h最大电流
    uint16_t min_cur;   // 24h最小电流
    uint16_t avg_vol;   // 24h平均电压
    uint16_t max_vol;   // 24h最大电压
    uint16_t min_vol;   // 24h最小电压
} SelftestReportItems;
// 信息包中时间的记录方式为, 记录从起始时间(cat1_startup_time)以来的分钟数;
// 每个记录为1byte，最大记录到240，超过240就插入一个特殊值0xff, 所以: 记录中 0xff的个数为n, 具体值为v, 表示时间为n*240+v
// 例如: 2000/01/01 00:00:00开始， 数据记录为 0x64, 0xff, 0x00, 0x02, 0xff, 0x01...第n个0xff, v1, v2... 
// 表示的时间记录点为: 2000/01/01 00:00:00开始的0*240+0x64 = 100分钟, 1*240+0 = 240分钟, 1*240+0x02 = 242分钟, 2*240+0x01 = 481分钟 ...
// 信息包中温度的记录方式为, 1Byte记录四舍五入的整数, 100表示0度; 比如 -4.8摄氏度记录为 -5 + 100 = 95
// 打包信息中, 具体温度变化信息紧随结构体记录, 记录方式为记录每次转折点 
// 起始温度|时间, 转折温度|时间, ...
// 打包信息中, 具体压机信息紧随温度信息记录, 记录方式, 为记录每次压机开关机时间
// 开时间，关时间，...


extern SelftestReportItems *selftest_report_p;
extern void Selftest_Init(uint32_t start_time_stamp);
